﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
using Aandelendelen.Db;
using Aandelendelen.Mail;
using Aandelendelen.Obs;
using Aandelendelen.Security;

namespace Aandelendelen.Controls
{
	public partial class AdvertiserRegisterControl : BaseUserControl
	{
		protected override void OnPostBack(object sender, EventArgs e)
		{
			Page.Validate();

			if (Page.IsValid)
			{
				this.RegisterAdvertiser();

				Response.Redirect("/AdvertiserRegisterConfirmation.aspx", true);
			}
		}

		public string Voorletters { get { return this.tbVoorletters.Text; } }
		public string Tussenvoegsel { get { return this.tbTussenvoegsel.Text; } }
		public string Achternaam { get { return this.tbAchternaam.Text; } }
		public string Email { get { return this.tbEmail.Text; } }
		public string Gebruikersnaam { get { return this.tbGebruikersnaam.Text.ToLower(); } }
		public bool Geslacht { get { return this.RadioButtonList1.Text == "1"; } }
		public string Wachtwoord { get { return this.tbWachtwoord.Text; } }

		protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate username
			try
			{
				args.IsValid = true;

				if (args.Value.Length < 6 || args.Value.Length > 16)
				{
					this.CustomValidator1.Text = "Gebruikersnaam is minimaal zes en maximaal 16 posities lang";

					args.IsValid = false;
				}

				if (args.IsValid)
				{
					Query query = new Query("s_advertiserexists", "Gebruikersnaam", args.Value, OleDbType.Char);

					int count = (int)query.Execute();

					if (count > 0)
					{
						this.CustomValidator1.Text = "Deze gebruikersnaam is reeds in gebruik. Kies a.u.b. een andere";
						args.IsValid = false;
					}
				}
			}
			catch
			{
				args.IsValid = false;
			}

		}

		protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord
			try
			{
				if (args.Value.Length < 6)
				{
					this.CustomValidator2.Text = "Wachtwoord is minimaal zes posities lang";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}

		}

		protected void CustomValidator3_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord-nogmaals
			try
			{
				if (args.Value != this.tbWachtwoord.Text)
				{
					this.CustomValidator3.Text = "Wachtwoord-nogmaals en wachtwoord komen niet overeen";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}
		}

		protected void CustomValidator4_ServerValidate(object source, ServerValidateEventArgs args)
		{
			if (EMail.IsEmailAddressValid(args.Value))
			{
				args.IsValid = true;
			}
			else
			{
				this.CustomValidator4.Text = "Geen geldig email adres";

				args.IsValid = false;
			}
		}

		private void RegisterAdvertiser()
		{
			QueryArguments args1 = new QueryArguments();

			args1.Add("Voorletters", this.Voorletters, OleDbType.Char);
			args1.Add("Tussenvoegsel", this.Tussenvoegsel, OleDbType.Char);
			args1.Add("Achternaam", this.Achternaam, OleDbType.Char);
			args1.Add("Geslacht", this.Geslacht, OleDbType.Boolean);
			args1.Add("Email", this.Email, OleDbType.Char);
			args1.Add("Gebruikersnaam", this.Gebruikersnaam, OleDbType.Char);
			args1.Add("Wachtwoord", Hash.GetMD5Hash(this.Wachtwoord), OleDbType.Char);

			Query query = new Query("i_adnewuser", args1);

			query.Execute();

			Userinfo userInfo = new Userinfo(this.Voorletters, this.Tussenvoegsel, this.Achternaam, this.Geslacht, this.Email);
			MailArguments mailArgs = MailArguments.MailArgs;
			mailArgs.Clear();

			mailArgs["{uid}"] = args1[5].Value.ToString();
			mailArgs["{aanhef}"] = userInfo.MailAanhef;

			EMail email = MailCache.GetMail("activateadaccount");
			email.Recipients = this.Email;

			email.QueueSingle();

			logger.Info("Advertiser account '{0}' registered", this.Gebruikersnaam);
		}
	}
}